// 常用的集合不同于数组和元祖
// Vector
// Vec<T>1.由标准库提供，2.可存多个值，3.只能存储相同类型的数据，4.在内存中是连续存放的
// 更新vector
// 删除vector
// 与任何其他的strcut一样，当vector离开作用域，他就会被清理掉，所有的元素也会被清理掉
// 使用vector中的值，1.索引2.get
// 索引不能超出范围否则程序会恐慌
// 符合所有权和借用规则
// 遍历vector中的值
// vector存放不同类型的数据enum配合vector

// String(结构复杂)来自标准库
// byte集合，将byte解析成文本
// rust语言层面只有一个字符串类型：字符串切片str或者&str
// 字符串切片：对存储在其他地方、utf-8编码的字符串的引用
// 字符串字面值：存储在二进制文件中，也是字符串切片
// 字符串是指包括string和&str
// 其他字符串OsString，OsStr，CString，CStr：string vs &str后缀：拥有或借用的变体；可存储不同编码的文本或者内存中以不同的形式展现
// 字符串不支持索引访问
// rust有三种看待字符串的方式：字节，标量，字形簇
// 切割string

// hashMap（用得少不在prelude中）
// 标准库对其支持较少，没有内置的宏来创建hashmap，数据存储在heap上
// hashmap是同构的，所有的key必须是同一种类型，所有的value也是同一种类型
// 创建hashmap的另一种方式collect，在元素类型为Tuple的Vector上使用的collect方法可以组件一个hashmap，
// 要求Tuple有两个值：key和value，collect可以把数据整合成多种集合类型，包括hashmap。返回值需要显式指明类型
// get获取hashmap的值
// 遍历hashmap
// 更新hashmap：新增和替换两种
// entry判断hashmap是否有值
// hash函数可以抵御dos攻击，安全性高但是不是最快的hash算法

use std::collections::HashMap;

enum vectorEnum {
    Float(f64),
    Text(String),
}

fn main() {
    let v: Vec<i32> = Vec::new();
    let mut v1 = vec![1, 2, 3, 5];
    v1.push(4); // 添加元素
    match v1.get(2) {
        Some(third) => println!("some：{}", third),
        None => println!("hello world！"),
    }
    for i in &mut v1 {
        *i += 10; // *为解引用
        println!("i:{}", i);
    }
    // vector存放不同类型的数据
    let vv = vec![
        vectorEnum::Float(10.12),
        vectorEnum::Text(String::from("testvectorEnum")),
    ];
    println!("hello world！{:#?},{}", v1, v1[0]);

    let s = String::from("adasd");
    let s1 = "32423423423".to_string();
    let mut s2 = String::new();
    s2.push_str("DFSD"); // 把一个字符串切片附加到String
    s2.push('L'); // 吧单个字符加到String
    println!("{}", s1 + &s); // +是把第一个字符串（失去所有权后面不能在用）和第二个字符串（保留所有权）的引用加到一起 // 强制转换
    // 以下效果相同
    let s3 = s + "-" + &s2;
    let s4 = format!("{}-{}", s2, s3);
    let s5 = &s4[0..3];

    let mut scores = HashMap::new();
    scores.insert(String::from("key"), 100); // 插入数据
    scores.insert(String::from("key"), 100111); // 修改数据
    scores.entry(String::from("key")).or_insert(6000); // entry判断是否有值，不存在就通过方法or_insert插入值
    scores.insert(String::from("key1"), 1000);

    // collect创建hashmap
    let teams = vec![String::from("Blue"), String::from("Yellow")];
    let intial_scores = vec![10, 30];
    let scores: HashMap<_,_> = teams.iter().zip(intial_scores.iter()).collect();
    let key = String::from("Blue");
    let score = scores.get(&key);
    match score {
        Some(s) => println!("{}", s),
        None => println!("none")
    }
    for (key, value) in &scores {
        println!("{}:{}", key, value);
    }
}
